package controllers

import (
	"LoveU/models"
	"LoveU/utils"

	"strconv"
	// "strings"
	"github.com/astaxie/beego"
)

type SearchController struct {
	beego.Controller
}

// 以“部分用户名”搜索用户
func (this *SearchController) SearchUserByName() {
	sid := this.Input().Get("sessionid")
	mySession := SessionStore[sid]
	if mySession == nil {
		notLoginSearch(this)
		return
	}

	pattern := this.Input().Get("name")
	pageNoStr := this.Input().Get("page")
	pageSizeStr := this.Input().Get("pagesize")
	if pageNoStr == "" {
		getJSONSearch(this, utils.ARGUMENT_DENIED, "参数错误41", "", nil)
		return
	}
	if pageSizeStr == "" {
		getJSONSearch(this, utils.ARGUMENT_DENIED, "参数错误47", "", nil)
		return
	}
	pageNum, err0 := strconv.ParseInt(pageNoStr, 10, 64)
	pageSize, err1 := strconv.ParseInt(pageSizeStr, 10, 64)
	if err0 != nil || err1 != nil {
		getJSONSearch(this, utils.ARGUMENT_DENIED, "参数错误63", "", nil)
		return
	}

	list := models.GetUserListByName(pattern, pageNum, pageSize)
	if list == nil {
		getJSONSearch(this, utils.UNKNOWN_ERROR, "数据库查询出错", "", nil)
		return
	}
	getJSONSearch(this, utils.OK, "success", "", list)
	return
}

// 获得所有用户的相对“缘分”得分、部分信息（试运行）
func (this *SearchController) SearchUserByDestiny() {
	sid := this.Input().Get("sessionid")
	mySession := SessionStore[sid]
	if mySession == nil {
		notLoginSearch(this)
		return
	}
	userid := mySession.Get("userid")
	pageNoStr := this.Input().Get("page")
	pageSizeStr := this.Input().Get("pagesize")
	myInfo := models.GetUserInfo(userid.(int64))
	if myInfo==nil {
		getJSONSearch(this, utils.USER_NOT_FOUND, "查询者的详细信息未填","",nil)
		return
	}
	var pageNum, pageSize int64
	if pageNoStr=="" || pageNoStr=="0" || pageSizeStr=="" || pageSizeStr=="0" {
		getJSONSearch(this, utils.ARGUMENT_DENIED, "参数错误63", "", nil)
		return
	} else {
		var err0,err1 error
		pageNum, err0 = strconv.ParseInt(pageNoStr, 10, 64)
		pageSize, err1 = strconv.ParseInt(pageSizeStr, 10, 64)
		if err0 != nil || err1 != nil {
			getJSONSearch(this, utils.ARGUMENT_DENIED, "参数错误63", "", nil)
			return
		}
	}
	// 注意：暂时忽略性别筛选（因全部性别字段为null）
	scores := models.GetUsersScore(models.DEFAULT_GENTLE,userid.(int64),pageNum,pageSize)
	if scores==nil {
		getJSONSearch(this, utils.UNKNOWN_ERROR,"数据库错误","",nil)
		return
	}
	getJSONSearch(this, utils.OK, "success","", scores)
}

// 获取（服务器记录的）全国省份（市、区），或该省的所有地级市，或该市的所有县级单位
// 【注意】若province为"0"、country不为"0"，则返回所有地名记录
func (this *SearchController) GetAreaAll() {
	sid := this.Input().Get("sessionid")
	mySession := SessionStore[sid]
	if mySession == nil {
		notLoginSearch(this)
		return
	}
	
	province := this.Input().Get("province")
	country := this.Input().Get("country")
	if province=="" && country=="" {
		//两项未填，视为查询所有地区名
		province = "0"
		country = "1"
	}
	if province=="" {
		province = "0"
	}
	if country=="" {
		country = "0"
	}
	status,areas := models.GetAreas(province,country)
	switch status {
		case utils.ARGUMENT_DENIED:
			getJSONSearch(this, utils.ARGUMENT_DENIED, "参数错误", "", nil)
		case utils.OK:
			getJSONSearch(this, utils.OK, "success", "", areas)
		default:
			getJSONSearch(this, utils.UNKNOWN_ERROR, "数据库查询出错", "", nil)
	}
}

// 获取全国省份（市、区）
func (this *SearchController) GetProvinceList() {
	sid := this.Input().Get("sessionid")
	mySession := SessionStore[sid]
	if mySession == nil {
		notLoginSearch(this)
		return
	}

	status,areas := models.GetAreas("0","0")
	switch status {
		case utils.ARGUMENT_DENIED:
			getJSONSearch(this, utils.ARGUMENT_DENIED, "参数错误", "", nil)
		case utils.OK:
			getJSONSearch(this, utils.OK, "success", "", areas)
		default:
			getJSONSearch(this, utils.UNKNOWN_ERROR, "数据库查询出错", "", nil)
	}
}

// 获取某省的所有地级市
func (this *SearchController) GetCountryList() {
	sid := this.Input().Get("sessionid")
	mySession := SessionStore[sid]
	if mySession == nil {
		notLoginSearch(this)
		return
	}
	
	province := this.Input().Get("province")
	//【注意】本方法不容忍province为空或为0
	if province=="" || province=="0"{
		getJSONSearch(this, utils.ARGUMENT_DENIED, "参数错误", "", nil)
		return
	}
	status,areas := models.GetAreas(province,"0")
	switch status {
		case utils.ARGUMENT_DENIED:
			getJSONSearch(this, utils.ARGUMENT_DENIED, "参数错误", "", nil)
		case utils.OK:
			getJSONSearch(this, utils.OK, "success", "", areas)
		default:
			getJSONSearch(this, utils.UNKNOWN_ERROR, "数据库查询出错", "", nil)
	}
}

// 根据areaid，或行政区划编号（分三段），返回唯一对应的地区代码、名称
func (this *SearchController) GetAreaById() {
	sid := this.Input().Get("sessionid")
	mySession := SessionStore[sid]
	if mySession == nil {
		notLoginSearch(this)
		return
	}
	areaStr := this.Input().Get("areaid")
	provinceStr := this.Input().Get("province")
	countryStr := this.Input().Get("country")
	countyStr := this.Input().Get("county")
	var areaInfo *models.Area
	var status int64
	result := new(models.AreaResult)
	if areaStr!="" {
		area,err := strconv.ParseInt(areaStr,10,64)
		if err!=nil {
			getJSONSearch(this,utils.ARGUMENT_DENIED, "参数错误","",nil)
			return
		}
		status,areaInfo = models.GetAreaById(area)
		if status==utils.AREA_CODE_OK {
			models.GetAreaNames(result,areaInfo)
		}
	} else {
		if provinceStr=="" || provinceStr=="0" {
			getJSONSearch(this,utils.ARGUMENT_DENIED, "参数错误","",nil)
			return
		}
		if countryStr=="" {
			countryStr = "0"
			if countyStr!="" {
				getJSONSearch(this,utils.ARGUMENT_DENIED, "参数错误","",nil)
				return
			}
		}
		if countyStr=="" {
			countyStr = "0"
		}
		status,areaInfo = models.GetAreaByCode(provinceStr,countryStr,countyStr)
		if status==utils.AREA_CODE_OK {
			models.GetAreaNames(result,areaInfo)
		}
	}
	
	switch status {
		case utils.AREA_CODE_OK:
			result.Id = areaInfo.Id
			result.Provinceid = areaInfo.Province
			result.Countryid = areaInfo.Country
			result.Countyid = areaInfo.County
			getJSONSearch(this,status, "success","",result)
		case utils.AREA_CODE_NOT_FOUND:
			getJSONSearch(this,status, "此ID无对应地区信息","",nil)
		case utils.ARGUMENT_DENIED:
			getJSONSearch(this,status, "参数错误","",nil)
		default:
			getJSONSearch(this,status, "其他错误","",nil)
	}
}